package com.cskaoyan.javase.oop1._9static._2compare;

/**
 * @description: 静态非静态的比较
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import sun.management.Agent;

/**
 * > 当我们了解static成员的特点后，静态成员和非静态成员的区别就很明显
 * > 我们从以下四个角度比较（拿成员变量为例）
 * 1. 成员的所属
 *  成员变量: 属于对象
 *  静态成员变量: 属于类
 *
 * 2. 在内存中的位置
 *  成员变量: 堆上的对象中,独属于对象
 *  静态成员变量: 在方法区(Java8之后在堆上)中,被全体对象共享
 *
 * 3. 在内存中出现的时间
 *  成员变量: 创建对象之后才有
 *  静态成员变量: 类加载之后就有了
 *
 * 4. 调用方式
 * 成员变量: 必须有对象,然后用对象名点访问
 * 静态成员变量: 直接类名点访问
 *
 * 成员方法也有类似的特点,思考以下问题:
 * 1. 在静态方法中，能否访问非静态的成员，为什么？
 * 不能,我们讲this关键字时,普通成员方法的形参列表中隐含了this传参,指向了当前对象(普通成员方法中有对象)
 * 而静态方法中没有隐含this传参,所以它不能访问非静态
 *
 * 静态方法仅需要类加载的过程就能够使用了,而类加载之后并不一定有对象,所以静态方法是不能访问属于对象的非静态成员
 *
 * 2. 在普通成员方法中，能否访问静态成员，为什么？
 * 能,普通成员方法想要访问,必须通过对象调用,对象都有了,一定类加载完毕了,所以静态成员都是可以使用的
 *
 * 补充:
 *      建议在使用静态成员时,加上类名,以示区分,增加代码可读性.
 *      (当然这不是必须的)
 *
 */

public class Demo {
    public static void main(String[] args) {

    }
}
class Student{
    int age;
    static String name;
    public static void testStudent(){
        //Non-static field 'age' cannot be referenced from a static context
        System.out.println(new Student().age);
    }

    public void test(){
        System.out.println(Student.name);
        Student.testStudent();
    }
}